import type { TabBar } from '@uni-helper/vite-plugin-uni-pages'
import pageConfig from '../pages.json'

export const AUTH_KEY = 'ignoreAuth'

const { pages, subPackages, tabBar = { list: [], custom: false } } = { ...pageConfig }

export const tabbarList = (tabBar?.list || []) as TabBar['list']

/**
 * 获取当前页面路径
 * @returns 当前页面路径
 */
export function getCurrentPage() {
  const currentPage = getCurrentPages()
  return currentPage[currentPage.length - 1]
}

/**
 * 获取当前页面路径
 * @returns 当前页面路径
 */
export function getCurrentPagePath() {
  const currentPage = getCurrentPage()
  return currentPage.route
}

/**
 * 是否自定义 tabbar
 */
export const isCustomTabbar = tabBar.custom === true

/**
 * 判断是否为 tabbar 页面
 * @param path 页面路径
 * @returns 是否为 tabbar 页面
 */
export function isTabbar(path?: string) {
  try {
    path = path || getCurrentPage()?.route
    if (!path) {
      return false
    }
    // tabbar 页面路径 没有 / 开头
    if (path.startsWith('/')) {
      path = path.substring(1)
    }
    return Boolean(tabBar?.list?.find(item => item.pagePath === path))
  }
  catch {
    return false
  }
}

/**
 * 解析地址
 * @param url 地址
 * @returns 解析后的地址对象
 */
export function parseUrl(url: string): { path: string, params: Record<string, string> } {
  const [_path, _params] = url.split('?')
  let path = _path

  // 判断路径 http 开头 则去掉
  if (path.startsWith('http')) {
    path = path.split('://')[1]
  }

  if (!_params) {
    return { path, params: {} }
  }

  const params = _params.split('&').reduce((acc, cur) => {
    const [key, value] = cur.split('=')
    acc[key] = value.startsWith('%') ? decodeURIComponent(value) : value
    return acc
  }, {} as Record<string, string>)
  return { path, params }
}

/**
 * 根据 url 获取页面路径
 * @param url 地址
 * @returns 页面路径
 */
export function getPathByUrl(url: string) {
  const { path } = parseUrl(url)
  return path
}

/**
 * 根据 url 获取参数
 * @param url 地址
 * @returns 参数对象
 */
export function getParamsByUrl(url: string) {
  const { params } = parseUrl(url)
  return params
}

/**
 * 获取所有页面
 * @returns 所有页面
 */
export function getAllPages() {
  // 主包
  const mainPages = [
    ...pages.map(page => ({ ...page, path: `/${page.path}` })),
  ]

  // 分包
  const subPages = []
  subPackages.forEach((subPackage) => {
    const { root, pages: _pages = [] } = subPackage
    _pages.forEach((page) => {
      subPages.push({
        ...page,
        path: `${root}/${page.path}`,
      })
    })
  })
  return [...mainPages, ...subPages]
}

/**
 * 获取白名单页面
 * @returns 白名单页面
 */
export function getWhiteList() {
  return getAllPages()
    .filter(page => page[AUTH_KEY] === true)
    .map(page => page.path)
}

// 平台
export const PLATFORM: string = __UNI_PLATFORM__

export const isH5 = PLATFORM === 'h5'
export const isMp = PLATFORM.startsWith('mp-')
export const isApp = PLATFORM === 'app'
export const isMpWeixin = PLATFORM.startsWith('mp-weixin')

export async function sleep(ms: number) {
  return new Promise(resolve => setTimeout(resolve, ms))
}
